﻿/**
 * \file StrategieCarte.cs
 * \brief Classe StrategieCarte
 * \author ARTUR Vincent
 * \author LAPERDRIX Pierre
 * \version 1.0
 */

namespace Implem
{
    using Interfaces;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Wrapper;

    /**
     * \class StrategieCarte
     * \brief Objet representant une strategie de generation de carte
     */
    public class StrategieCarte : IStrategieCarte
    {
        /*!< Taille de la carte */
        protected int _taille;

        /*!< Propriete accedant a l'attribut _taille */
        public int Taille
        {
            get { return _taille; }
            set { _taille = value; }
        }

        /**
         * \fn public virtual Case[][] genererCarte()
         * \brief Genere la carte
         * \return la matrice de cases correspondant a la carte
         */
        public virtual Case[][] genererCarte()
        {
            
            int[][] mat = this.creerMatrice();
            int t = mat[0].Length;
            Case[][] cases = new Case[t][];
            for(int i=0;i<t;i++){ 
                cases[i] = new Case[t];
            }

            //Construction matrice de cases à partir de la matrice d'entiers
            for (int i = 0; i < t; i++){
                for (int j = 0; j < t; j++)
                {
                    switch (mat[i][j])
                    {
                        case 0:
                            cases[i][j] = FabriquePoidsMoucheCase.INSTANCE.getDesert();
                            break;
                        case 1:
                            cases[i][j] = FabriquePoidsMoucheCase.INSTANCE.getMontagne();
                            break;
                        case 2:
                            cases[i][j] = FabriquePoidsMoucheCase.INSTANCE.getPlaine();
                            break;
                        case 3:
                            cases[i][j] = FabriquePoidsMoucheCase.INSTANCE.getDesertFruit();
                            break;
                        case 4:
                            cases[i][j] = FabriquePoidsMoucheCase.INSTANCE.getMontagneFruit();
                            break;
                        case 5:
                            cases[i][j] = FabriquePoidsMoucheCase.INSTANCE.getPlaineFruit();
                            break;
                        case 6:
                            cases[i][j] = FabriquePoidsMoucheCase.INSTANCE.getDesertFer();
                            break;
                        case 7:
                            cases[i][j] = FabriquePoidsMoucheCase.INSTANCE.getMontagneFer();
                            break;
                        default:
                            cases[i][j] = FabriquePoidsMoucheCase.INSTANCE.getPlaineFer();
                            break;

                    }
                }
            }

            return cases;
        }

        /**
         * \fn public unsafe virtual int[][] creerMatrice()
         * \brief Cree une matrice d'entiers a partir de l'algorithme de generation de la DLL
         * \return la matrice
         */
        public unsafe virtual int[][] creerMatrice() {
            WGenMap wg = new WGenMap();
            int[][] mat = new int[Taille][];
            for (int k = 0; k < Taille; k++)
            {
                mat[k] = new int[Taille];
            }
            int** tmp = wg.genererCarte(Taille);
            for (int i = 0; i < Taille; i++)
            {
                for (int j = 0; j < Taille; j++)
                {
                    mat[i][j] = tmp[i][j];
                }
            }
            return mat;
        }
    }
}